{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "from exp.nb_04 import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Initial setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 9 video](https://course19.fast.ai/videos/?lesson=9&t=7013)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train,y_train,x_valid,y_valid = get_data()\n",
    "train_ds,valid_ds = Dataset(x_train, y_train),Dataset(x_valid, y_valid)\n",
    "nh,bs = 50,512\n",
    "c = y_train.max().item()+1\n",
    "loss_func = F.cross_entropy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = DataBunch(*get_dls(train_ds, valid_ds, bs), c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "def create_learner(model_func, loss_func, data):\n",
    "    return Learner(*model_func(data), loss_func, data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [0.6664653125, tensor(0.8075)]\n",
      "valid: [0.302250390625, tensor(0.9146)]\n",
      "train: [0.291615546875, tensor(0.9162)]\n",
      "valid: [0.2376760986328125, tensor(0.9324)]\n",
      "train: [0.23417873046875, tensor(0.9323)]\n",
      "valid: [0.2117640869140625, tensor(0.9397)]\n"
     ]
    }
   ],
   "source": [
    "learn = create_learner(get_model, loss_func, data)\n",
    "run = Runner([AvgStatsCallback([accuracy])])\n",
    "\n",
    "run.fit(3, learn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [0.762880078125, tensor(0.7988)]\n",
      "valid: [0.36490234375, tensor(0.8969)]\n",
      "train: [0.3508654296875, tensor(0.9002)]\n",
      "valid: [0.30942646484375, tensor(0.9107)]\n",
      "train: [0.30202353515625, tensor(0.9126)]\n",
      "valid: [0.26613701171875, tensor(0.9218)]\n"
     ]
    }
   ],
   "source": [
    "learn = create_learner(partial(get_model, lr=0.3), loss_func, data)\n",
    "run = Runner([AvgStatsCallback([accuracy])])\n",
    "\n",
    "run.fit(3, learn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "def get_model_func(lr=0.5): return partial(get_model, lr=lr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Annealing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We define two new callbacks: the Recorder to save track of the loss and our scheduled learning rate, and a ParamScheduler that can schedule any hyperparameter as long as it's registered in the state_dict of the optimizer. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 9 video](https://course19.fast.ai/videos/?lesson=9&t=7202)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "class Recorder(Callback):\n",
    "    def begin_fit(self): self.lrs,self.losses = [],[]\n",
    "\n",
    "    def after_batch(self):\n",
    "        if not self.in_train: return\n",
    "        self.lrs.append(self.opt.param_groups[-1]['lr'])\n",
    "        self.losses.append(self.loss.detach().cpu())        \n",
    "\n",
    "    def plot_lr  (self): plt.plot(self.lrs)\n",
    "    def plot_loss(self): plt.plot(self.losses)\n",
    "\n",
    "class ParamScheduler(Callback):\n",
    "    _order=1\n",
    "    def __init__(self, pname, sched_func): self.pname,self.sched_func = pname,sched_func\n",
    "\n",
    "    def set_param(self):\n",
    "        for pg in self.opt.param_groups:\n",
    "            pg[self.pname] = self.sched_func(self.n_epochs/self.epochs)\n",
    "            \n",
    "    def begin_batch(self): \n",
    "        if self.in_train: self.set_param()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's start with a simple linear schedule going from start to end. It returns a function that takes a `pos` argument (going from 0 to 1) such that this function goes from `start` (at `pos=0`) to `end` (at `pos=1`) in a linear fashion."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 9 video](https://course19.fast.ai/videos/?lesson=9&t=7431)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sched_lin(start, end):\n",
    "    def _inner(start, end, pos): return start + pos*(end-start)\n",
    "    return partial(_inner, start, end)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can refactor this with a decorator."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 9 video](https://course19.fast.ai/videos/?lesson=9&t=7526)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "def annealer(f):\n",
    "    def _inner(start, end): return partial(f, start, end)\n",
    "    return _inner\n",
    "\n",
    "@annealer\n",
    "def sched_lin(start, end, pos): return start + pos*(end-start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# shift-tab works too, in Jupyter!\n",
    "# sched_lin()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.3"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f = sched_lin(1,2)\n",
    "f(0.3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And here are other scheduler functions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "@annealer\n",
    "def sched_cos(start, end, pos): return start + (1 + math.cos(math.pi*(1-pos))) * (end-start) / 2\n",
    "@annealer\n",
    "def sched_no(start, end, pos):  return start\n",
    "@annealer\n",
    "def sched_exp(start, end, pos): return start * (end/start) ** pos\n",
    "\n",
    "def cos_1cycle_anneal(start, high, end):\n",
    "    return [sched_cos(start, high), sched_cos(high, end)]\n",
    "\n",
    "#This monkey-patch is there to be able to plot tensors\n",
    "torch.Tensor.ndim = property(lambda x: len(x.shape))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Jump_to lesson 9 video](https://course19.fast.ai/videos/?lesson=9&t=7730)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "annealings = \"NO LINEAR COS EXP\".split()\n",
    "\n",
    "a = torch.arange(0, 100)\n",
    "p = torch.linspace(0.01,1,100)\n",
    "\n",
    "fns = [sched_no, sched_lin, sched_cos, sched_exp]\n",
    "for fn, t in zip(fns, annealings):\n",
    "    f = fn(2, 1e-2)\n",
    "    plt.plot(a, [f(o) for o in p], label=t)\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In practice, we'll often want to combine different schedulers, the following function does that: it uses `scheds[i]` for `pcts[i]` of the training."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "def combine_scheds(pcts, scheds):\n",
    "    assert sum(pcts) == 1.\n",
    "    pcts = tensor([0] + listify(pcts))\n",
    "    assert torch.all(pcts >= 0)\n",
    "    pcts = torch.cumsum(pcts, 0)\n",
    "    def _inner(pos):\n",
    "        idx = (pos >= pcts).nonzero().max()\n",
    "        if idx == 2: idx = 1\n",
    "        actual_pos = (pos-pcts[idx]) / (pcts[idx+1]-pcts[idx])\n",
    "        return scheds[idx](actual_pos)\n",
    "    return _inner"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here is an example: use 30% of the budget to go from 0.3 to 0.6 following a cosine, then the last 70% of the budget to go from 0.6 to 0.2, still following a cosine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sched = combine_scheds([0.3, 0.7], [sched_cos(0.3, 0.6), sched_cos(0.6, 0.2)]) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f8c1cc93588>]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(a, [sched(o) for o in p])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use it for training quite easily..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "cbfs = [Recorder,\n",
    "        partial(AvgStatsCallback,accuracy),\n",
    "        partial(ParamScheduler, 'lr', sched)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = create_learner(get_model_func(0.3), loss_func, data)\n",
    "run = Runner(cb_funcs=cbfs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: [0.788337578125, tensor(0.7860)]\n",
      "valid: [0.3378462158203125, tensor(0.8999)]\n",
      "train: [0.29788216796875, tensor(0.9127)]\n",
      "valid: [0.2410066162109375, tensor(0.9319)]\n",
      "train: [0.23813974609375, tensor(0.9312)]\n",
      "valid: [0.2132032958984375, tensor(0.9400)]\n"
     ]
    }
   ],
   "source": [
    "run.fit(3, learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "... then check with our recorder if the learning rate followed the right schedule."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "run.recorder.plot_lr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "run.recorder.plot_loss()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Export"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Converted 05_anneal.ipynb to nb_05.py\r\n"
     ]
    }
   ],
   "source": [
    "!./notebook2script.py 05_anneal.ipynb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
